/**
 * 两个大数a和b，求ab之积，其中b必然所有位数的数字相同
 * 令 b = k * 111....
 * 再令 a = a * k
 * 接下来只需计算 a * 111.... 即可
 * 列出竖式进行观察，可以发现结果的每一位都是a中的连续一段的和
 * 因此先求出前缀和，然后对每一位可以快速的的到结果。
 */
#include <bits/stdc++.h>
using namespace std;
#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;
using vll = vector<llt>;

string A, B;
vi Va;
vi S;
vi Ans;

void work(){ 
    Ans.clear();
    S.clear();
    Va.clear();
    
    cin >> A >> B;
    int n = A.length();
    for(int i=n-1;i>=0;--i){
        Va.emplace_back(A[i] - '0');
    }

    int k = B[0] - '0';
    int c = 0;
    for(int i=0;i<n;++i){
        auto t = k * Va[i] + c;
        Va[i] = t % 10;
        c = t / 10;
    }
    assert(c < 10);
    if(c) Va.emplace_back(c);

    S.assign(Va.size(), 0);
    S[0] = Va[0];
    for(int i=1;i<S.size();++i){
        S[i] = Va[i] + S[i - 1];
    }

    auto f = [&](int s, int e){
        if(s > 0) return S[e] - S[s - 1];
        return S[e];
    };

    n = B.length();
    int left = 1 - n;
    int right = 0;
    c = 0;
    for(int i=0;i<n+Va.size();++i){
        auto t = f(max(0, left), min(right, (int)Va.size() - 1)) + c;
        
        Ans.emplace_back(t % 10);
        c = t / 10;

        right += 1, left += 1;
    }

    while(c){
        Ans.emplace_back(c % 10);
        c /= 10;
    }
    k = Ans.size() - 1;
    while(k >= 0 and Ans[k] == 0) --k;
    if(k < 0) return (void)(cout << 0 << endl);


    for(int i=k;i>=0;--i)cout << Ans[i];
    cout << endl;
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	cin >> nofkase;
	while(nofkase--) work();
	return 0;
}